\section{Пролог и эпилог функций}
\label{sec:prologepilog}
\myindex{Function epilogue}
\myindex{Function prologue}

Пролог функции это инструкции в самом начале функции. Как правило это что-то вроде такого фрагмента кода:

\begin{lstlisting}[style=customasmx86]
    push    ebp
    mov     ebp, esp
    sub     esp, X
\end{lstlisting}

Эти инструкции делают следующее: сохраняют значение регистра \EBP на будущее, выставляют \EBP равным \ESP,
затем подготавливают место в стеке для хранения локальных переменных.

\EBP сохраняет свое значение на протяжении всей функции, он будет использоваться здесь для доступа 
к локальным переменным и аргументам. Можно было бы использовать и \ESP, но он постоянно меняется и 
это не очень удобно.

Эпилог функции аннулирует выделенное место в стеке, восстанавливает значение \EBP на старое и возвращает 
управление в вызывающую функцию:

\begin{lstlisting}[style=customasmx86]
    mov    esp, ebp
    pop    ebp
    ret    0
\end{lstlisting}

% what about calling convention?
Пролог и эпилог функции обычно находятся в дизассемблерах для отделения функций друг от друга.

\subsection{\Recursion}

\myindex{\Recursion}
Наличие эпилога и пролога может несколько ухудшить эффективность рекурсии.

Больше о рекурсии в этой книге: \myref{Recursion_and_tail_call}.
